package com.obelisco.vista.controles;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.List;

import nextapp.echo2.app.Extent;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.list.DefaultListModel;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

import echopointng.SelectFieldEx;

public class SelectField extends SelectFieldEx {
	
	private List listaObjetos;
	private String  nombreAtributo;
	private String  nombreCampoClave;	
	private String  nombreItemDefecto = "Seleccione...";
	private boolean itemDefectoActivado = true;
	
	int auxPosicionAnterior = 0;
	int posicionAnterior = 0;
	
	private int ancho = 100;
	
	private ActionListener eventoCombo = new ActionListener(){
		
		public void actionPerformed(ActionEvent arg0) {
			posicionAnterior = auxPosicionAnterior;
			auxPosicionAnterior = getSelectedIndex();
		}
	};
		
	public SelectField(int ancho){
		super();
		this.ancho = ancho;
		initComponents();
	}
	
	private void initComponents() {
		setStyleName("Obelisco.SelectField");
		setWidth(new Extent(ancho));
		addActionListener(eventoCombo);
		auxPosicionAnterior = getSelectedIndex();
	}	
	
	public void setSelectedItem(Object item){	
		if(item!=null){
			try {
				if(this.nombreCampoClave!=null){
					Object pkItem = PropertyUtils.getProperty(item, this.nombreCampoClave);
					for (int i = 0; i < listaObjetos.size(); i++) {
						Object aux = (Object)listaObjetos.get(i);
						Object pkAux = PropertyUtils.getProperty(aux, this.nombreCampoClave);		
						if(pkItem.equals(pkAux)){
							if(this.itemDefectoActivado){
								this.setSelectedIndex(i+1);						
							}
							else{
								this.setSelectedIndex(i);
							}
							break;
						}				
					}				
				}
				else{
					for (int i = 0; i < listaObjetos.size(); i++) {
						String aux = (String)listaObjetos.get(i);
						if(aux.equals(item)){
							if(this.itemDefectoActivado){
								this.setSelectedIndex(i+1);						
							}
							else{
								this.setSelectedIndex(i);
							}
							break;
						}				
					}
				}
				posicionAnterior = auxPosicionAnterior;
				auxPosicionAnterior = getSelectedIndex();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}		
		}
		else{
			this.setSelectedIndex(-1);
		}
	}
	
	public void setSelectedItemPorId(Serializable id){

		try {
			if ((this.nombreCampoClave != null) &&
				(id != null)){
				for (int i = 0; i < listaObjetos.size(); i++) {
					Object aux = (Object)listaObjetos.get(i);
					Object pkAux = PropertyUtils.getProperty(aux, this.nombreCampoClave);					
					if(id.equals(pkAux)){
						if(this.itemDefectoActivado){
							this.setSelectedIndex(i+1);						
						}
						else{
							this.setSelectedIndex(i);
						}
						break;
					}				
				}				
			}			
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
	
	
	public void inicializarDatos(List items, String nombreAtributo, String nombreCampoClave){		
		this.listaObjetos = items;
		this.nombreAtributo = nombreAtributo;
		this.nombreCampoClave = nombreCampoClave;
		this.agregarModelo();
	}
	
	public List getItems(){		
		return this.listaObjetos;				
	}
	
	public Object getSelectedItem(){
		int indice = this.getSelectedIndex();
		if(this.listaObjetos != null){

			if(this.itemDefectoActivado){
				if(indice>0){
					return this.listaObjetos.get(indice-1);				
				}	
			}
			else{
				if(indice>-1){
					return this.listaObjetos.get(indice);				
				}
			}
		}
		return null; 		
	}
	
	public Object getItemAnterior(){
		if(this.listaObjetos != null){			
			if(this.itemDefectoActivado){
				if(posicionAnterior>0){
					return this.listaObjetos.get(posicionAnterior-1);				
				}	
			}			
		}
		return null; 		
	}

	private void agregarModelo(){		
		try {
			DefaultListModel modelo = new DefaultListModel();
			Object valorAtributo;
			if(this.itemDefectoActivado){
				modelo.add(this.nombreItemDefecto);	
			}	
			for (Iterator i = this.listaObjetos.iterator(); i.hasNext();) {
				if (this.nombreAtributo != null)
				{
					Object item = (Object) i.next();
					valorAtributo = BeanUtils.getProperty(item, this.nombreAtributo);
				}
				else
				{
					valorAtributo = (String) i.next();
				}
				modelo.add(valorAtributo);
			}
			this.setModel(modelo);
			this.setSelectedIndex(0);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void setItems(List listaObjetos) {
		this.listaObjetos = listaObjetos;
		this.agregarModelo();
	}

	public String getNombreItemDefecto() {
		return nombreItemDefecto;
	}

	public void setNombreItemDefecto(String nombreItemDefecto) {
		this.nombreItemDefecto = nombreItemDefecto;
	}

	public boolean isItemDefectoActivado() {
		return itemDefectoActivado;
	}

	public void setItemDefectoActivado(boolean itemDefectoActivado) {
		this.itemDefectoActivado = itemDefectoActivado;
	}

	public String getNombreCampoClave() {
		return nombreCampoClave;
	}

	public void setNombreCampoClave(String nombreCampoClave) {
		this.nombreCampoClave = nombreCampoClave;
	}

	public String getNombreAtributo() {
		return nombreAtributo;
	}

	public void setNombreAtributo(String nombreAtributo) {
		this.nombreAtributo = nombreAtributo;
	}
	
	public int getPosicionAnterior() {
		return posicionAnterior;
	}

	public void setPosicionAnterior(int posicionAnterior) {
		this.posicionAnterior = posicionAnterior;
		this.auxPosicionAnterior = posicionAnterior;
	}

}